package com.yeban.base.Test;

import java.util.Scanner;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/2
 */
// 万年历
public class PerpetualCalendar {

    public void welcome() {

        Scanner sc = new Scanner(System.in);
        System.out.println("*-----------------欢迎使用万年历-----------------*");

        boolean flag = true;
        while(flag) {
            // 判断是否继续查看万年历
            System.out.println("请输入年份（1900以后）：");
            int year = sc.nextInt();
            System.out.println("请输入月份：");
            int month = sc.nextInt();
            Calendar(year,month);
            flag = next();
        }

    }

    // 是否继续页面
    public boolean next() {
        Scanner sc = new Scanner(System.in);
        System.out.println("------------继续---Y|y    退出----N|n------------");
        String select = sc.next();
        switch (select) {
            case "Y":
            case "y":
                return true;
            case "N":
            case "n":
                System.out.println("---------------感谢使用万年历！！！！---------------");
                return false;
            default:
                System.out.println("输入选项错误！请重新输入!");
                return next();
        }
    }

    // important！！
    // 显示月份，日期，星期：1900年1月1日 是 星期一
    public void Calendar(int year, int month) {
        System.out.print("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        System.out.println();

        int days = daysOfMonth(year,month); //当月天数
        int firstDayOffset = apartDays(year,month,1);    // 当月第一天距离1900年1月1日的天数
        int firstIndex = (firstDayOffset + 1) % 7;     // 计算是星期几
        
        // 打印空格
        for(int i = 0; i < firstIndex; i++) {
            System.out.print("\t\t");
        }

        // 打印日期
        for(int i = 1; i <= days; i++) {
            System.out.print(i + "\t\t");
            if((i + firstIndex) % 7 == 0) { // 星期六就换行
                System.out.println();
            }
        }
        System.out.println();

    }

    // 目标日期与1900年1月1日相隔天数半段
    public int apartDays(int year, int month, int day) {
        // 相隔多少天，差几月，差几年
        int days = 0;
        int months = month - 1;

        // 加整年间隔天数
        for (int y = 1900; y < year; y++) {
            days += isLeapYear(y) ? 366 : 365;
        }

        // 加差整月的天数
        while(months != 0) {
            days += daysOfMonth(year,months);
            months --;
        }

        // 加最后一个月的天数，并返回
        return days + day - 1;
    }

    // 判断闰年
    public boolean isLeapYear(int year) {
        // 闰年能被4整除，但不能被100整除
        // 或者能被400整除的年份是闰年
        if ( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) {
            return true;
        }
        return false;
    }

    // 判断月份对应的天数
    public int daysOfMonth(int year, int month) {

        int days = 0;

        switch (month) {
            // 一个月31天的月份
            case 1:     // January (一月)
            case 3:     // March (三月)
            case 5:     // May (五月)
            case 7:     // July (七月)
            case 8:     // August (八月)
            case 10:    // October (十月)
            case 12:    // December (十二月)
                days = 31;
                break;

            // 一个月30天的月份
            case 4:     // April (四月)
            case 6:     // June (六月)
            case 9:     // September (九月)
            case 11:    // November (十一月)
                days = 30;
                break;

            // 特殊的二月
            case 2: // February (二月)
                if(isLeapYear(year)) {
                    days = 29;
                    break;
                } else {
                    days = 28;
                    break;
                }

            // 用户输入错误
            default:
                System.out.println("输入的月份有误！请重新输入！");
        }

        return days;
    }

    public static void main(String[] args) {

        PerpetualCalendar c = new PerpetualCalendar();

        // 进入欢迎界面
        c.welcome();

    }
}
